package com.briup.Client.Impl;

import com.briup.Client.Client;
import com.briup.Config.Impl.SmartConfigImpl;
import com.briup.Config.PropertiesAware;
import com.briup.Logger.Impl.LogImpl;
import com.briup.Logger.Log;
import com.briup.entity.Environment;
import org.apache.log4j.Logger;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Collection;

/**
 * ### 客户端
 * ```java
 * void send(Collection<Environment> environments);
 * ```
 * > 实现步骤
 * > 1. 创建接口实现类实现客户端接口
 * > 2. 实现`Cilent`接口中未实现的抽象方法`send`方法
 * > 3. 将采集模块中采集的Collection<Environment>对象通过`send`方法发送至服务器端
 * > 4. 创建Socket对象（指定服务器端ip以及端口）
 * > 5. Environment类需要实现`Serializable`接口，代表Environment对象是可以序列化的
 * > 6. 通过对象输出流包装Socket中获取的字节流对象，将采集模块中获取的Collection<Environment>对象以对象流的方式通过Socket发送至接收端（服务器端）
 */
public class ClientImpl implements Client , PropertiesAware {
    //private Log log=new LogImpl();
    private Logger log= Logger.getLogger("com.briup.Client.Impl.ClientImpl");

    //指定服务器地址和端口号
    //private String host="127.0.0.1";
    private String host;

    //private int port=9999;
    private int port;
    @Override
    public void send(Collection<Environment> environments) {
        log.info("开始启动客户端");
        //创建客户端对象
        Socket socket = null;
        //声明对象流（序列化）
        ObjectOutputStream oos=null;
        try {
            socket = new Socket(host, port);
            oos=new ObjectOutputStream(socket.getOutputStream());

            log.info("客户端正在发送集合数据....");
//            for (Environment environment : environments) {
//                System.out.println(environment);
//            }
            oos.writeObject(environments);
            log.info("数据发送成功！");
        } catch (IOException e) {
            log.error("客户端发送失败.....");
        }finally {
            if(oos!=null){
                try {
                    oos.close();
                } catch (IOException e) {
                    log.error("流关闭失败...");
                }
            }
            if(socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    log.error("流关闭失败...");
                }
            }
        }
    }

    @Override
    public void setProperties() {
        host = (String) SmartConfigImpl.getPropertiesMap().get("serverIP");
        port = Integer.parseInt((String) SmartConfigImpl.getPropertiesMap().get("serverPort"));

    }
}
